home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 7
/
FM Towns Free Software Collection 7.iso
/
taropyon
/
znsplay
/
src
/
aboutdlg.c
next >
Wrap
C/C++ Source or Header
|
1993-11-30
|
4KB
|
179 lines
/*************************************************************************
* About dialog
*************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include "znsplay.h"
#define DLG_MINXS (320) /* ダイアログ最小サイズ */
#define STR_FNTX (6)
#define STR_FNTY (12)
#define STR_XS (STR_FNTX)
#define STR_YS (STR_FNTY+2)
#define STR_BUFSIZ (4096)
#define STR_XSL (76)
typedef struct
{
EVT_T *evt;
MOSTKP *mosTk;
int len;
char *sp[32];
CONST char *name;
CONST char *ver;
COLOR strCol;
COLOR bacCol;
COLOR boxCol;
} DLGPARA_T;
static void dspFunc( DLG_T *dlg )
{
DLGPARA_T *para;
int len, i, x, evtNo = 0;
FRAME fr;
para = dlg->ptr;
fr.x1 = dlg->fr.x0;
fr.y1 = dlg->fr.y0;
fr.x2 = dlg->fr.x0 + dlg->fr.xs - 1;
fr.y2 = dlg->fr.y0 + dlg->fr.ys - 1;
if ( para->mosTk == NULL )
{ para->mosTk = MOS_pushPos( &fr, dlg->fr.xs/2, dlg->fr.ys/2);
} else
{ /* 復帰したときのカーソル位置を移動量分修正 */
para->mosTk->pos.x += (MosX - para->mosTk->newPos.x);
para->mosTk->pos.y += (MosY - para->mosTk->newPos.y);
para->mosTk->newPos.x = MosX;
para->mosTk->newPos.y = MosY;
MOS_moveFrame( &fr ); /* 移動範囲 */
MOS_setPos( para->mosTk->newPos.x, para->mosTk->newPos.y );
}
/* ダイアログ外枠 */
boxHol(fr.x1+2, fr.y1+2, fr.x2-2, fr.y2-2, PSET, C_DARK, C_GRAY );
box (fr.x1+3, fr.y1+3, fr.x2-3, fr.y2-3, PSET, COLMIX(C_INFO,C_GRAY) );
box (fr.x1+4, fr.y1+4, fr.x2-4, fr.y2-4, PSET, COLMIX(C_INFO,C_GRAY) );
boxHol(fr.x1+5, fr.y1+5, fr.x2-5, fr.y2-5, PSET, C_GRAY, C_DARK );
/* APPLICATION NAME & VERSION */
i = (len = strlen(para->name)) * 8 + 8 + (8*4) + strlen(para->ver) * 8;
x = fr.x1 + (dlg->fr.xs - i)/2;
DSP_symbol( x, fr.y1+12, 8,16, OPAQUE, DspCtrl.black, dlg->baseCol, 1,0,0,0, para->name );
DSP_str( x + len *8 + 8, fr.y1+12+7, DspCtrl.black, dlg->baseCol, 8,
"ver.%s", para->ver );
box ( fr.x1 + 9, fr.y1 + 34-2, fr.x2 - 9, fr.y1 + 34 + STR_YS*para->len-1 + 2, PSET, C_DARK );
boxf( fr.x1 +10, fr.y1 + 34-1, fr.x2 -10, fr.y1 + 34 + STR_YS*para->len-1 + 1, PSET, DspCtrl.white);
for ( i = 0; i < para->len; ++i )
{ x = fr.x1 + (dlg->fr.xs - (strlen(para->sp[i])*STR_XS))/2;
DSP_puts12(
x, fr.y1+34+STR_YS*i + ((STR_YS-STR_FNTY)/2),
DspCtrl.black, DspCtrl.white, _Pers_, para->sp[i] );
}
/* 右クリック [CANCEL] */
_EVT_SETMOS( para->evt, evtNo++, 999, MOSEVT_BTNOLY, BTN_RIGHT,
0,0,0,0, 0, NULL );
/* ダイアログ移動用 */
_EVT_SETMOS_FR( para->evt, evtNo++, 0, MOSEVT_NOACT|MOSEVT_QUICK, BTN_LEFT,
&fr, DLG_defMoveFunc, dlg );
}
int Apl_dlgMsg( int x0, int y0, CONST char *ver, CONST char *name, CONST char *msg, ... )
{
char *s;
char *tmp = NULL;
va_list arg;
int i, j, max;
int xs, ys;
int ch;
UINT ec;
DLGPARA_T para;
DLG_T *dlg = NULL;
char page = DspCtrl.writePage;
para.mosTk = NULL;
para.evt = NULL;
para.name = name;
para.ver = ver;
/* 画面分の文字列格納バッファを確保する */
if ( (tmp = malloc(STR_BUFSIZ)) == NULL )
return (0x1B);
va_start( arg, msg );
vsprintf( tmp, msg, arg );
va_end();
void term(void)
{ if ( dlg ) DLG_close(dlg);
if ( para.evt ) EVT_free(para.evt);
if ( para.mosTk ) MOS_popPos( para.mosTk );
if ( tmp ) free(tmp);
DSP_writePage(page);
};
max = ((strlen(name) + 1 + strlen(ver)) * 8 + 5) / 6;
para.sp[0] = s = tmp;
para.len = 1;
j = FALSE;
i = 0;
while ( *s )
{ if ( *s == '\n' || i > STR_XSL )
{ *s++ = '\0';
para.sp[para.len] = s;
i = 0;
j = TRUE;
} else
{ if ( j )
{ ++para.len;
j = FALSE;
}
++s;
++i;
}
if ( i > max )
max = i;
}
xs = 16 + max * STR_XS + 16;
if ( xs < DLG_MINXS )
xs = DLG_MINXS;
ys = 10 + 20 + 4+ STR_YS * para.len + 4 + 10;
if ( (para.evt = EVT_alloc(NULL,8)) == NULL )
{ term();
return (0x1B);
}
DSP_writePage(1);
dlg = DLG_open( x0, y0, xs, ys, C_DLGBASE, dspFunc, ¶ );
if ( dlg == NULL )
{ term();
return (0x1B);
}
DLG_dsp( dlg );
LOOP
{
MOS_CON();
ch = EVT_getkey(&ec);
if ( ch == 0xFFFF && (ec & 0xFF00) == 0xFF00 )
{ if ( EVT_chk(para.evt, EVTIGN_KEY) > 0 )
{ ch = 0x1B;
break;
}
} else
break;
}
term();
return (ch);
}